package com.huaxin.hxenum.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;

/**
 * 变电箱/开关柜类型枚举（已根据最新业务需求重构）
 * 覆盖现代配电系统中常见的一二次设备柜体类型
 */
public enum SwitchCabinetType implements BaseCodeEnum<String> {

    /**
     * 进线柜：主电源输入柜
     */
    MAIN_INCOMER("main_incomer", "进线"),

    /**
     * 馈线柜：出线回路，向负载供电
     */
    FEEDER("feeder", "馈线"),

    /**
     * 计量柜：电能计量专用柜（如总表）
     */
    METERING("metering", "计量"),

    /**
     * PT柜：电压互感器柜，用于电压测量与保护
     */
    PT("pt", "PT"),

    /**
     * 分段联络柜：用于母线分段或两段母线之间的联络开关
     */
    SECTIONALIZING("sectionalizing", "分段联络"),

    /**
     * 站用变柜：内置变压器，为站内控制、照明等提供低压电源
     */
    STATION_SERVICE_TRANSFORMER("station_service_transformer", "站用变"),

    /**
     * 辅柜翻线柜：用于控制信号线转接、端子排布置的辅助柜
     */
    AUXILIARY_WIRING("auxiliary_wiring", "辅柜翻线"),

    /**
     * 无功补偿柜：电容器组、SVC 或 SVG，用于功率因数补偿
     */
    REACTIVE_POWER_COMPENSATION("reactive_power_compensation", "无功补偿"),

    /**
     * 有源滤波柜：APF 装置，用于滤除谐波
     */
    ACTIVE_FILTER("active_filter", "有源滤波"),

    /**
     * 双电源切换柜：实现两路电源自动切换（ATS 功能）
     */
    TRANSFER_SWITCH("transfer_switch", "双电源切换"),

    /**
     * 电力变压器柜：干式变压器柜，用于电压变换
     */
    POWER_TRANSFORMER("power_transformer", "电力变压器"),

    /**
     * 直流装置柜：直流屏，提供开关操作电源
     */
    DC_POWER_SYSTEM("dc_power_system", "直流装置"),

    /**
     * 电力电缆柜：电缆进出线柜，含电缆支架和密封装置
     */
    CABLE_TERMINATION("cable_termination", "电力电缆"),

    /**
     * 配套设施柜：用于提供其他附属设备，如电表、水表、水表控制器、水表读数、水表读数上传、水表读数下载、水表读数查询、水表读数报警、水表读数报警处理、水表读数报警处理、水表读数报警处理、水表读数报警处理、水表读数报警处理、水表读数报警处理、水表读
     */
    FACILITY_SUPPORT("facility_support", "配套设施");

    @EnumValue
    private final String code;
    private final String displayName;

    SwitchCabinetType(String code, String displayName) {
        this.code = code;
        this.displayName = displayName;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 根据 code 获取枚举实例
     */
    public static SwitchCabinetType of(String code) {
        if (code == null || code.trim().isEmpty()) return null;
        for (SwitchCabinetType type : values()) {
            if (type.getCode().equalsIgnoreCase(code.trim())) {
                return type;
            }
        }
        return null;
    }

    /**
     * 判断 code 是否有效
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }
}
